/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package csp;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Leandro
 */
public class VMR implements HeuristicaValor {
    private ExpertoRestriccionesAntena verificador;

    public ExpertoRestriccionesAntena getVerificador() {
        return verificador;
    }

    public void setVerificador(ExpertoRestriccionesAntena verificador) {
        this.verificador = verificador;
    }


    public List<Valor> ordenarValores(List<Valor> valoresPosibles,Variable varActual, int numDominio) {

        //Simular para cada asignación de valor en valores posibles a var cuanto se restringe cada una de las
        //relacionadas con var
        List<Valor> PosiblesVisible;
        Antena antenaAprobar;
        Antena antenaVisible;
        UbicacionAntena aux;
        aux = (UbicacionAntena) varActual;
        int[] contador = new int[valoresPosibles.size()];
        int i = 0;
        if (valoresPosibles.size() == numDominio){
            return valoresPosibles;
        }
        for (Valor valorAprobar : valoresPosibles){
        antenaAprobar= (Antena) valorAprobar;   
        /*
            for(Variable consecutiva : aux.getConsecutivas()){
                if(consecutiva.getAsignado() == null){
                    PosiblesConsecutivas = consecutiva.getValoresPosibles();
                    for (Valor valorConsecutiva: PosiblesConsecutivas){
                        antenaConsecutiva = (Antena) valorConsecutiva;
                            while(antenaConsecutiva != antenaAprobar){
                                if (antenaAprobar.getFrecuencia() == antenaConsecutiva.getFrecuencia()){
                                    
                                }
                            }
                    }
                }
            }
*/            
            for (Variable visible : aux.getVisibles()) {
                if (visible.getAsignado() == null) {
                    PosiblesVisible = visible.getValoresPosibles();
                    for (Valor valorVisible : PosiblesVisible) {
                        antenaVisible = (Antena) valorVisible;
                        
                        if (antenaAprobar != antenaVisible) { //para no comprobar con la misma antena
                            if ((antenaAprobar.getPotencia() + antenaVisible.getPotencia()) > verificador.getPotencia()) {
                                contador[i] = contador[i]+ 1;
                            }
                            if(aux.getConsecutivas().contains(visible)){
                                    if(antenaAprobar.getFrecuencia() == antenaVisible.getFrecuencia()){
                                        contador[i] = contador[i]+ 1;
                                    }
                                }
                            
                        }
                    }
                }
            }
            i++;
        }
        
        return  ordenarValores(contador,valoresPosibles);
        
    }

    private List<Valor> ordenarValores(int[] contador, List<Valor> valoresPosibles) {
        List<Valor> ordenada = new ArrayList<Valor>(valoresPosibles);
       // ordenada = valoresPosibles;
        int posMenor;
        for(int i = 0; i< valoresPosibles.size();i++){
        posMenor = posicionMenor (contador);
        ordenada.set(i,valoresPosibles.get(posMenor));
        contador[posMenor] = 101;
        }
        return (List)ordenada;
    }

    private int posicionMenor(int[] contador) {
        int menor = 100;
        int posicion = 0;
        for (int j =0 ;j<contador.length;j++){
            if(contador[j] < menor){
                menor = contador[j];
                posicion = j;
            }  
        }
        return posicion;
    }

   

}
